/**
 * 语音消息播放工具
 * 功能：播放语音、自动播放下一条、更新进度、错误处理
 */
import store from "../store";
export const play = {
  // 初始化音频上下文
  initAudioContext() {
    // 如果已有音频实例，先清理
    if (this.audioContext) {
      this.stop();
      this.audioContext.offTimeUpdate();
      this.audioContext.offEnded();
      this.audioContext.offError();
    }
    
    // 创建新的音频实例
    this.audioContext = uni.createInnerAudioContext();
    
    // 平台兼容性处理
    this.handlePlatformCompatibility();
    
    return this.audioContext;
  },
  
  // 平台兼容性处理
  handlePlatformCompatibility() {
    if (!this.audioContext) return;
    
    // 获取平台信息
    const sysInfo = store.state.msg.systemInfo;
    const platform = sysInfo.platform;
    
    // 仅在App端设置不跟随系统静音
    if (platform === 'ios' || platform === 'android') {
      try {
        this.audioContext.obeyMuteSwitch = false;
      } catch (e) {
        console.warn('设置不跟随系统静音失败:', e);
      }
    }
  },
  
  /**
   * 播放语音
   * @param {Object} vm - 组件实例
   * @param {Number} index - 消息索引
   */
  play(vm, index) {
    // 验证参数
    if (!vm || !vm.msgList || index === undefined || index < 0) {
      console.error('无效的播放参数');
      return;
    }
    
    const msg = vm.msgList[index];
    
    // 验证消息是否包含有效语音
    if (!msg?.content?.voicePath) {
      console.warn('当前消息不包含语音路径');
      return;
    }
    
    // 如果正在播放当前语音，直接返回
    if (vm.stateConfig?.isPlaying && vm.stateConfig?.isplay === index) {
      return;
    }
    
    // 初始化音频上下文
    const audioContext = this.initAudioContext();
    
    // 更新播放状态
    this.updatePlayState(vm, true, index);
    
    // 设置音频源
    audioContext.src = msg.content.voicePath;
    
    // 绑定进度更新事件
    audioContext.onTimeUpdate(() => {
      this.updateProgress(vm, msg, audioContext);
    });
    
    // 绑定播放结束事件
    audioContext.onEnded(() => {
      this.handlePlayEnd(vm, index);
    });
    
    // 绑定错误处理事件
    audioContext.onError((err) => {
      this.handlePlayError(vm, err);
    });
    
    // 开始播放
    audioContext.play().catch(err => {
      console.warn('播放失败:', err);
      this.handlePlayError(vm, err);
    });
  },
  
  /**
   * 更新播放进度
   * @param {Object} vm - 组件实例
   * @param {Object} msg - 消息对象
   * @param {Object} audioContext - 音频上下文
   */
  updateProgress(vm, msg, audioContext) {
    const duration = msg.content.duration || 0;
    if (duration > 0 && audioContext.currentTime !== undefined) {
      vm.progressPercent = (audioContext.currentTime / duration) * 100;
    }
  },
  
  /**
   * 处理播放结束
   * @param {Object} vm - 组件实例
   * @param {Number} currentIndex - 当前播放索引
   */
  handlePlayEnd(vm, currentIndex) {
    // 重置当前播放状态
    this.updatePlayState(vm, false, -1);
    vm.progressPercent = 0;
    
    // 查找下一条语音消息
    const nextIndex = this.findNextAudioMessageIndex(vm, currentIndex);
    if (nextIndex !== -1) {
      // 播放下一条
      this.playNextAfterDelay(vm, nextIndex);
    }
  },
  
  /**
   * 延迟播放下一条，确保UI更新完成
   * @param {Object} vm - 组件实例
   * @param {Number} nextIndex - 下一条索引
   * @param {Number} delay - 延迟时间(ms)
   */
  playNextAfterDelay(vm, nextIndex, delay = 300) {
    setTimeout(() => {
      vm.$nextTick(() => {
        // 如果需要滚动到下一条消息
        if (vm.msgList[nextIndex].timestamp) {
          vm.viewId = `msgall-${vm.msgList[nextIndex].timestamp}`;
        }
        this.play(vm, nextIndex);
      });
    }, delay);
  },
  
  /**
   * 处理播放错误
   * @param {Object} vm - 组件实例
   * @param {Object} err - 错误对象
   */
  handlePlayError(vm, err) {
    console.error('语音播放错误:', err);
    this.updatePlayState(vm, false, -1);
    vm.progressPercent = 0;
    
    // 显示错误提示
    uni.showToast({
      title: '语音播放失败',
      icon: 'none',
      duration: 2000
    });
  },
  
  /**
   * 更新播放状态
   * @param {Object} vm - 组件实例
   * @param {Boolean} isPlaying - 是否正在播放
   * @param {Number} index - 当前播放索引
   */
  updatePlayState(vm, isPlaying, index) {
    if (vm.stateConfig) {
      vm.stateConfig.isPlaying = isPlaying;
      vm.stateConfig.isplay = index;
    }
  },
  
  /**
   * 查找下一条语音消息的索引
   * @param {Object} vm - 组件实例
   * @param {Number} currentIndex - 当前索引
   * @returns {Number} 下一条语音索引，没有则返回-1
   */
  findNextAudioMessageIndex(vm, currentIndex) {
    if (!vm.msgList || !Array.isArray(vm.msgList)) {
      return -1;
    }
    
    for (let j = currentIndex + 1; j < vm.msgList.length; j++) {
      // 假设messageType为1表示音频消息
      if (vm.msgList[j]?.messageType === 1) {
        return j;
      }
    }
    return -1;
  },
  
  /**
   * 停止播放
   */
  stop() {
    if (this.audioContext) {
      this.audioContext.stop();
    }
  },
  
  /**
   * 销毁音频实例
   */
  destroy() {
    if (this.audioContext) {
      this.audioContext.stop();
      this.audioContext.offTimeUpdate();
      this.audioContext.offEnded();
      this.audioContext.offError();
      this.audioContext.destroy();
      this.audioContext = null;
    }
  }
};
    